﻿namespace MobileTrack.Web.Controllers
{
    using System.Globalization;
    using System.Linq;
    using System.Web.Mvc;
    using System.Web.Security;
    using MobileTrack.Core;
    using MobileTrack.Core.Data;
    using MobileTrack.Core.Model;
    using MobileTrack.Web.Properties;
    using MobileTrack.Web.ViewModels;

    public class HomeController : BaseController
    {
        public HomeController(IRepositories repositories, MembershipProvider membershipProvider, RoleProvider roleProvider)
            : base(repositories, membershipProvider, roleProvider)
        {
        }

        public ActionResult Index()
        {
            var model = new NotificationsViewModel();

            if (this.User.IsInRole(Constants.AdministradorRole))
            {
                this.AddNotification(model, Estado.Pendiente, string.Empty);
                this.AddNotification(model, Estado.EnDeposito, string.Empty);
                this.AddNotification(model, Estado.EnTransito, string.Empty);
                this.AddNotification(model, Estado.DisponibleVenta, string.Empty);
                this.AddNotification(model, Estado.Vendido, string.Empty);
                this.AddNotification(model, Estado.Dañado, string.Empty);
            }
            else
            {
                var sucursalRole = this.RoleProvider.GetSucursalRoleForUser(this.User.Identity.Name);
                
                if (this.User.IsInRole(Constants.AsocianteRole))
                {
                    this.AddNotification(model, Estado.Pendiente, sucursalRole);
                    this.AddNotification(model, Estado.EnDeposito, sucursalRole);
                    this.AddNotification(model, Estado.Dañado, sucursalRole);
                }
                else if (this.User.IsInRole(Constants.DespachanteRole))
                {
                    this.AddNotification(model, Estado.EnDeposito, sucursalRole);
                    this.AddNotification(model, Estado.DisponibleVenta, sucursalRole);
                    this.AddNotification(model, Estado.Dañado, sucursalRole);
                }
                else if (this.User.IsInRole(Constants.ReceptorRole))
                {
                    this.AddNotification(model, Estado.EnTransito, sucursalRole);
                    this.AddNotification(model, Estado.DisponibleVenta, sucursalRole);
                    this.AddNotification(model, Estado.Dañado, sucursalRole);
                }
                else if (this.User.IsInRole(Constants.VendedorRole))
                {
                    this.AddNotification(model, Estado.EnTransito, sucursalRole);
                    this.AddNotification(model, Estado.DisponibleVenta, sucursalRole);
                    this.AddNotification(model, Estado.Vendido, sucursalRole);
                    this.AddNotification(model, Estado.Dañado, sucursalRole);
                }
            }

            return this.View(model);
        }

        private void AddNotification(NotificationsViewModel model, Estado estado, string sucursal)
        {
            var estadoString = ModelHelper.ToString(estado);
            var query = this.Repositories
                .Celulares
                .All
                .Select(Celular.LastSeguimientoExpression)
                .Where(s => s.EstadoInt == (int)estado);

            var sucursalMessage = string.Empty;
            var sucursalFilter = string.Empty;

            if (!string.IsNullOrWhiteSpace(sucursal))
            {
                sucursalMessage = string.Format(CultureInfo.InvariantCulture, " para la sucursal {0}", sucursal);
                sucursalFilter = string.Format(CultureInfo.InvariantCulture, "+Ubicacion:{0}", sucursal);
                query = query.Where(s => s.Sucursal.Nombre.Contains(sucursal));
            }

            var celularIds = query
                .Select(s => s.CelularId)
                .Distinct()
                .ToArray();

            var queryCount = this.Repositories
                .Celulares
                .All
                .Where(c => celularIds.Contains(c.Id))
                .Count();
            
            if (queryCount > 0)
            {
                var notification = new Notification
                {
                    Description = string.Format(
                        CultureInfo.InvariantCulture,
                        Resources.BaseNotificationMessage,
                        queryCount,
                        estadoString,
                        sucursalMessage),
                    LinkUrl = this.Url.Action(
                        "Index",
                        "Imeis",
                        new { filter = string.Format(CultureInfo.InvariantCulture, "Estado:{0}{1}", estadoString, sucursalFilter) })
                };

                model.Notifications.Add(notification);
            }
        }
    }
}
